package com.dongdongshop.log;


import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

// 日志切面类    放入spring容器
@Component
@Aspect // 表示当前类为切面类
public class LogAspect {

    public Logger logger = LoggerFactory.getLogger(LogAspect.class);


    // 切点表达式   通知(前置通知,后置通知,异常通知,环绕通知,返回后通知)
//    @Pointcut("execution(public * com.dongdongshop.service.*.*(..))")
    @Pointcut("@annotation(com.dongdongshop.annotation.Log)")
    public void aopLog(){}

    // 前置通知
    @Before("aopLog()")
    public void doBefore(JoinPoint joinPoint){
        // 打印参数和返回值
        Object[] args = joinPoint.getArgs();// 获取每一个被调用的 service 方法的参数
        Signature signature = joinPoint.getSignature();// 正在执行的方法
        logger.info("正在执行的方法为 : {} , 参数为 : {} ",signature,args);
    }

    // 后置通知
    @AfterReturning(pointcut = "aopLog()",returning = "result")
    public void doAfter(Object result) throws Throwable{
        logger.info("方法执行结束,返回值为 : {}", JSONObject.toJSONString(result));
    }
}
